/*global pi */
// 页面分析及缓存模块，加载成功后后分析成页面对象，body部分解析成模板，head的css应用也被加载成文本，js的src解析出来但并不加载。body和css中的图片的url或src被替换成正确的。

pi.mod.define('pi.ui.page', function(pi) {
	"use strict";
	// 定义模块
	var module = {},
	table = {},
	wait = {},

	// 匹配body
	BODY = /<body[^>]*>([\W\w]*)<\/body>/i,
	// 匹配head
	HEAD = /<head[^>]*>([\W\w]*)<\/head>/i,
	// 匹配js脚本
	JS_SRC = /<script[^>]*src=["|']([^>]*)["|'][^>]*>\W*<\/script>/gi,
	// 匹配CSS脚本
	CSS_HREF = /<link[^>]*href=["|']([^>"']*)["|'][^<]*>/gi,
	// 匹配img src脚本
	IMG_SRC = /<img[^>]*src=["|']([^>"']*)["|'][^<]*>/gi,
	// 匹配CSS中img url脚本
	IMG_URL = /url\(([^\)]*)\)/gi,

	// 调用等待的回调
	callWait = function(wait, url, page) {
		var i, arr = wait[url];
		delete wait[url];
		for (i = arr.length - 1; i >= 0; i--) {
			arr[i](page);
		}
	},
	// 替换字符串中的url
	replaceStr = function(str, match, url) {
		return pi.str.replaceMatch(str, match, function(s) {
			return pi.mod.absUrl(s, url);
		});
	},
	// 分析页面，获得template,css,js
	parsePage = function(str, url) {
		var i, r, page = {};
		r = str.match(BODY);
		// 修正图片的src
		r = replaceStr(r, IMG_SRC, url);
		// 修正图片的url
		r = replaceStr(r, IMG_URL, url);
		page.template = pi.template.encode(r ? r[1] : "");
		r = str.match(HEAD);
		if (!r) {
			return {
				error: -13,
				reason: "head not found"
			};
		}
		str = r[1];
		r = pi.str.match(str, CSS_HREF);
		for (i = r.length - 1; i >= 0; i--) {
			// 转成绝对地址
			r[i] = pi.mod.absUrl(r[i], url);
		}
		page.css = r;
		r = pi.str.match(str, JS_SRC);
		for (i = r.length - 1; i >= 0; i--) {
			// 转成绝对地址
			r[i] = pi.mod.absUrl(r[i], url);
		}
		page.js = r;
		return page;
	};

	// 加载指定url的页面
	module.load = function(url, callback) {
		var page = table[url];
		if (page) {
			callback(page);
			return;
		}
		// 如果页面正在加载，则放入等待队列
		if (wait[url]) {
			wait[url].push(callback);
			return;
		}
		wait[url] = [callback];
		// 加载指定的页面
		pi.res.load(url, pi.res.STR, function(result) {
			var page, i, n, arr = [];
			if (result.error) {
				return callWait(wait, url, result);
			}
			// 分析页面
			page = parsePage(result, url);
			if (page.error) {
				return callWait(wait, url, page);
			}
			// 加载页面中的css
			for (i = 0, n = page.css.length; i < n; i++) {
				arr.push([page.css[i], pi.res.STR]);
			}
			pi.res.loads(arr, function(result) {
				var i, n;
				if (result.error) {
					return callWait(wait, url, result);
				}
				// 设置页面中的css的文本
				for (i = 0, n = page.css.length; i < n; i++) {
					// 修正css中图片的url
					page.css[i] = replaceStr(result[i], IMG_URL, url);
				}
				table[url] = page;
				callWait(wait, url, page);
			});
		});
	};

	// 获得页面正文模板混合后的字符串, addCss表示前面是否加上css
	module.mixBody = function(page, mix, addCss) {
		var s = pi.template.decode(page.template, mix);
		return (addCss) ? "<style type='text/css'>" + page.css.join('\n') + "</style>" + s : s;
	};
	// 通过url获取已经加载的页面
	module.get = function(url) {
		return table[url];
	};

	return module;
});